/*
    NAME
       pthread_create - create a new thread

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

       Compile and link with -pthread.
       parameters:
                1、thread：输出型参数，线程pid。
                2、attr:线程的属性（比如线程的栈大小）。
                3、start_routine：函数指针类型，回调函数。返回值为void*，参数也是void*。新线程的入口函数。
                4、arg:创建线程成功，新线程回调线程函数的时候，需要参数。就是传递给start_routine函数指针的参数。

        这份代码是关于：线程创建
*/

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>

using namespace std;

// 全局变量被所有线程共享,为线程通信提供了基础。
int g_val = 100;

// 可以被多个执行流同时执行，show函数被重入了！
void show(const string& name)
{
    cout << name << "say# " << "hello thread" << endl;
}

// new thread
void* threadRoutine(void* args)
{
    while(true)
    {
        printf("new thread pid: %d, g_val: %d, &g_val: 0x%p\n", getpid(), g_val, &g_val);
        // cout << "new thread, pid: " << getpid() << ", g_val: " << g_val << endl;
        // show("[new thread]");
        // sleep(1);
        // g_val++;

        // 新线程异常，整个进程终止。
        sleep(5);
        int a = 10;
        a /= 0;
    }
}

int main()
{
    pthread_t pid;
    pthread_create(&pid, nullptr, threadRoutine, nullptr);  // 不是系统调用

    while(true)
    {
        printf("main thread pid: %d, g_val: %d, &g_val: 0x%p\n", getpid(), g_val, &g_val);
        // cout << "main thread, pid: " << getpid() << ", g_val: " << g_val << endl;
        // show("[main thread]");
        sleep(1);
        g_val++;

    }
    return 0;
}